using System;
using System.Collections.Generic;
using Csla;
using ENT.GP.Datos.MysqlHelper;
using System.Data;

namespace ENT.GP.Core.Proyecto
{
    [Serializable]
    public class ProyectoLista :
      ReadOnlyListBase<ProyectoLista, ProyectoInfo>
    {
        #region Authorization Rules

        private static void AddObjectAuthorizationRules()
        {
            // TODO: add authorization rules
            //AuthorizationRules.AllowGet(typeof(ProyectoLista), "Role");
        }

        #endregion

        #region Factory Methods

        public static ProyectoLista GetProyectoLista(ProyectoCriterio criterio)
        {
            return DataPortal.Fetch<ProyectoLista>(criterio);
        }

        private ProyectoLista()
        { /* require use of factory methods */ }

        #endregion

        #region Data Access

        private void DataPortal_Fetch(ProyectoCriterio criterio)
        {
            RaiseListChangedEvents = false;
            IsReadOnly = false;
            string NombreSP = "";
            // TODO: load values
            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySql.Data.MySqlClient.MySqlParameter[] parametros = new MySql.Data.MySqlClient.MySqlParameter[6];
            parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("Programa", criterio.ProgramaId);
            parametros[1] = new MySql.Data.MySqlClient.MySqlParameter("Eje", criterio.EjeId);
            parametros[2] = new MySql.Data.MySqlClient.MySqlParameter("Tipo", criterio.TipoId);
            parametros[3] = new MySql.Data.MySqlClient.MySqlParameter("Estado", criterio.EstadoId);
            parametros[4] = new MySql.Data.MySqlClient.MySqlParameter("Nombre", criterio.Nombre);
            parametros[5] = new MySql.Data.MySqlClient.MySqlParameter("IdEmpresa", criterio.IdEmpresa);
            if (criterio.BuscaPerfiles)
                NombreSP = "BuscarPerfilesProyectos";
            else
                NombreSP = "BuscarProyectos";
            foreach (DataRow items in objhm.EjecutarStoreProcedure(parametros, NombreSP).Tables[0].Rows)
            {
                this.Add(ProyectoInfo.GetProyectoInfo(items));
            }
            
            IsReadOnly = true;
            RaiseListChangedEvents = true;
        }

        #endregion
    }


    [Serializable]
    public class ProyectoInfo : ReadOnlyBase<ProyectoInfo>
    {
        #region Business Methods

        // TODO: add your own fields, properties and methods
        public int Id { get; set; }
        public string Nombre { get; set; }
        public DateTime? FechaInicio { get; set; }
        public DateTime? FechaFin { get; set; }
        public double Presupuesto { get; set; }
        public double Latitud { get; set; }
        public double Longitud { get; set; }
        public string Viabilidad { get; set; }
        public string Dictamen { get; set; }
        public string Descripcion { get; set; }
        public double Saldo { get; set; }
        public double UltimoPago { get; set; }
        public double AportePlan { get; set; }
        public double AportePlanConDescuento { get; set; }
        public int PorcentajeAvance { get; set; }
        public int Estado { get; set; }
        public int Tipo { get; set; }
        public int NumeroDias { get; set; }
        public int PoblacionAfectada { get; set; }
        public int NumeroHabitantes { get; set; }
        #endregion

        #region Factory Methods

        internal static ProyectoInfo GetProyectoInfo(DataRow childData)
        {
            return DataPortal.FetchChild<ProyectoInfo>(childData);
        }

        private ProyectoInfo()
        { /* require use of factory methods */ }

        #endregion

        #region Data Access

        private void Child_Fetch(DataRow childData)
        {
            DateTime fI, fF;
            DateTime.TryParse(childData[3].ToString(), out fI);
            DateTime.TryParse(childData[4].ToString(), out fF);

            this.Id =Convert.ToInt32( childData[0].ToString());
            this.Nombre = childData[2].ToString();
            this.Descripcion = childData[19].ToString();

            this.FechaInicio = fI;
            this.FechaFin = fF;
            
            this.Estado = Convert.ToInt32(childData[18].ToString());
            this.Tipo = Convert.ToInt32(childData[7].ToString());
            
            this.Presupuesto =Convert.ToDouble( childData[5].ToString());
            this.Latitud = Convert.ToDouble(childData[23].ToString());
            this.Longitud = Convert.ToDouble(childData[24].ToString());
            this.Dictamen = childData[26].ToString();
            this.Viabilidad = childData[27].ToString();
            if (childData[31].ToString() != "")
                this.Saldo = Convert.ToDouble(childData[31].ToString());
            else
                this.Saldo = 0;
            if (childData[32].ToString() != "")
                this.UltimoPago = Convert.ToDouble(childData[32].ToString());
            else
                this.UltimoPago = 0;
            if (childData[14].ToString() != "")
                this.AportePlan = Convert.ToDouble(childData[14].ToString());
            else
                this.AportePlan = 0;
            if (childData[35].ToString() != "")
                this.AportePlanConDescuento = Convert.ToDouble(childData[35].ToString());
            else
                this.AportePlanConDescuento = 0;
            if (childData[30].ToString() != "")
                this.PorcentajeAvance = Convert.ToInt32(Convert.ToDouble(childData[30].ToString()));
            else
                this.PorcentajeAvance = 0;
            if (childData[29].ToString() != "")
                this.PoblacionAfectada = Convert.ToInt32(Convert.ToDouble(childData[29].ToString()));
            else
                this.PoblacionAfectada = 0;
            if (childData[22].ToString() != "")
                this.NumeroHabitantes = Convert.ToInt32(Convert.ToDouble(childData[22].ToString()));
            else
                this.NumeroHabitantes = 0;
        }
        
        #endregion
    }
}
